/**
 * 223. 矩形面积
 * https://leetcode-cn.com/problems/rectangle-area/
 */
public class Solutions_223 {
    public static void main(String[] args) {
        int A = -3, B = 0, C = 3, D = 4;
        int E = 0, F = -1, G = 9, H = 2;  // output: 45

        int result = computeArea(A, B, C, D, E, F, G, H);
        System.out.println(result);
    }

    public static int computeArea(int A, int B, int C, int D,
                                  int E, int F, int G, int H) {
        // 计算出两个矩形的面积（长 * 宽）
        int area1 = Math.abs((C - A) * (D - B));
        int area2 = Math.abs((G - E) * (H - F));

        // 判断两个矩形是否重叠
        if (!isOverlap(A, B, C, D, E, F, G, H)) {
            // 未重叠
            return area1 + area2;
        }
        // 重叠区域的四个点（左下角 x、y 坐标，右上角 x、y 坐标）
        int lx, ly, rx, ry;
        lx = Math.max(A, E);
        ly = Math.max(B, F);
        rx = Math.min(C, G);
        ry = Math.min(D, H);

        // 两个矩形重叠的情况下，面积为：矩形 1 面积 - 重叠面积 + 矩形 2 面积
        int overlapArea = Math.abs((rx - lx) * (ry - ly));
        return area1 - overlapArea + area2;
    }

    /**
     * 判断两个矩形在坐标中是否重叠
     * 逆向思维，因为重叠的情况可能很多，但是不重叠的情况，只有 4 种
     */
    public static boolean isOverlap(int A, int B, int C, int D,
                                int E, int F, int G, int H) {
        // 矩形 A 在矩形 B 左边：矩形 A 的右上角 x 小于 矩形 B 的左下角 x
        if (C < E) {
            return false;
        }
        // 矩形 A 在矩形 B 右边：矩形 A 的左下角 x 大于 矩形 B 的左上角 x
        if (A > G) {
            return false;
        }
        // 矩形 A 在矩形 B 上边：矩形 A 的左下角 y 大于 矩形 B 的右上角 y
        if (B > H) {
            return false;
        }
        // 矩形 A 在矩形 B 下边：矩形 A 的右上角 y 小于 矩形 B 的左下角 y
        if (D < F) {
            return false;
        }
        return true;
    }
}
